package rectilinear;

import java.awt.Color;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;

import javax.swing.SwingConstants;
import javax.swing.border.Border;

/**
 * ResizableBorder is responsible for drawing the border of the component and determining
 * the type of the cursor to use.
 * 
 *  To see the source and a good explanation of the code, see:
 *  
 *  http://zetcode.com/tutorials/javaswingtutorial/resizablecomponent/
 *
 */
public class ResizableBorder implements Border {

	private int dist = 8;

	private int locations[]; 
	private int cursors[];

	public ResizableBorder(int dist, int[] locations, int[] cursors) {
		this.dist = dist;
		this.locations = locations;
		this.cursors = cursors;
	}
	
	@Override
	public Insets getBorderInsets(Component arg0) {
		return new Insets(dist, dist, dist, dist);
	}

	@Override
	public boolean isBorderOpaque() {
		return false;
	}

	@Override
	public void paintBorder(Component component, Graphics g, int x, int y,
            int w, int h) {
	      g.setColor(Color.yellow);
	      g.drawRect(x+1, y+1, w-2, h-2);
	 
	      if (component.hasFocus()) {
	        for (int i = 0; i < locations.length; i++) {
	          Rectangle rect = getRectangle(x, y, w, h, locations[i]);
	          g.setColor(Color.WHITE);
	          g.fillRect(rect.x, rect.y, rect.width - 1, rect.height - 1);
	          g.setColor(Color.BLACK);
	          g.drawRect(rect.x, rect.y, rect.width - 1, rect.height - 1);
	        }
	      }
	}
	
	private Rectangle getRectangle(int x, int y, int w, int h, int location) {
	      switch (location) {
	      case SwingConstants.NORTH:
	          return new Rectangle(x + w / 2 - dist / 2, y, dist, dist);
	      case SwingConstants.SOUTH:
	          return new Rectangle(x + w / 2 - dist / 2, y + h - dist, dist,
	                               dist);
	      case SwingConstants.WEST:
	          return new Rectangle(x, y + h / 2 - dist / 2, dist, dist);
	      case SwingConstants.EAST:
	          return new Rectangle(x + w - dist, y + h / 2 - dist / 2, dist,
	                               dist);
	      case SwingConstants.NORTH_WEST:
	          return new Rectangle(x, y, dist, dist);
	      case SwingConstants.NORTH_EAST:
	          return new Rectangle(x + w - dist, y, dist, dist);
	      case SwingConstants.SOUTH_WEST:
	          return new Rectangle(x, y + h - dist, dist, dist);
	      case SwingConstants.SOUTH_EAST:
	          return new Rectangle(x + w - dist, y + h - dist, dist, dist);
	      }
	      return null;
	  }
	
	public int getCursor(MouseEvent me) {
	      Component c = me.getComponent();
	      int w = c.getWidth();
	      int h = c.getHeight();

	      for (int i = 0; i < locations.length; i++) {
	          Rectangle rect = getRectangle(0, 0, w, h, locations[i]);
	          if (rect.contains(me.getPoint()))
	              return cursors[i];
	      }

	      return Cursor.MOVE_CURSOR;
	  }
}
